/*
 * @ProjectName: 编程学习
 * @Copyright:   2019 HangZhou Yi Dev, Ltd. All Right Reserved.
 * @address:     https://yiyuery.github.io/
 * @date:        2019/5/20 20:57
 * @email:       xiazhaoyang@live.com
 * @description: 本内容仅限于编程技术学习使用，转发请注明出处.
 */
package com.yi.yier.boot.autoconfigure.codegenerator.api.service.mybatis;

import com.github.pagehelper.PageInfo;

import java.util.List;

/**
 * <p>
 *  Mybatis方法接口定义
 * </p>
 *
 * @author Yi
 * @version v1.0.0
 * @date 2019-06-29 21:13
 * @modificationHistory=========================逻辑或功能性重大变更记录
 * @modify By: {修改人} 2019-06-29
 * @modify reason: {方法名}:{原因}
 * ...
 */
public interface BaseMybatisService<Record, Example> {
    /**
     * 根据条件查询记录数量
     *
     * @param example
     * @return
     */
    long countByExample(Example example);

    /**
     * 根据条件删除记录
     *
     * @param example
     * @return
     */
    int deleteByExample(Example example);

    /**
     * 根据主键删除记录
     *
     * @param recordId
     * @return
     */
    <T> int deleteByPrimaryKey(T recordId);

    /**
     * 插入记录
     *
     * @param record
     * @return
     */
    int insert(Record record);

    /**
     * 批量插入
     * @param records
     * @return
     */
    int insertList(List<Record> records);

    /**
     * 插入记录有效字段
     *
     * @param record
     * @return
     */
    int insertSelective(Record record);

    /**
     * 批量插入有效字段
     * @param record
     * @return
     */
    int insertListSelective(List<Record> record);

    /**
     * 根据条件查询记录
     *
     * @param example
     * @return
     */
    List<Record> selectByExample(Example example);


    /**
     * 根据主键查询记录
     *
     * @param recordId
     * @return
     */
    <T> Record selectByPrimaryKey(T recordId);

    /**
     * 根据条件更新有效字段
     *
     * @param record
     * @param example
     * @return
     */
    int updateByExampleSelective(Record record, Example example);

    /**
     * 根据条件更新记录
     *
     * @param record
     * @param example
     * @return
     */
    int updateByExample(Record record, Example example);

    /**
     * 根据主键更新记录有效字段
     *
     * @param record
     * @return
     */
    int updateByPrimaryKeySelective(Record record);

    /**
     * 根据主键更新记录
     *
     * @param record
     * @return
     */
    int updateByPrimaryKey(Record record);

    /**
     * 根据主键批量更新
     * @param records
     * @return
     */
    int updateListByPrimaryKey(List<Record> records);

    /**
     * 根据条件查询记录并按页码分页,不查询总数
     *
     * @param example  条件
     * @param pageNo   页数
     * @param pageSize 每页记录数
     * @return
     */
    List<Record> selectByExampleForPage(Example example, Integer pageNo, Integer pageSize);

    /**
     * 根据条件查询记录并按页码分页
     *
     * @param example  条件
     * @param pageNo   页数
     * @param pageSize 每页记录数
     * @return
     */
    PageInfo<Record> selectByExampleForPageInfo(Example example, Integer pageNo, Integer pageSize);

    /**
     * 根据条件查询记录并按偏移量分页,不查询总数
     *
     * @param example
     * @param limit
     * @param offset
     * @return
     */
    List<Record> selectByExampleForLimit(Example example, Integer limit, Integer offset);
}
